/**
 * @file    tcp_client.c
 * @brief   测试两个Linux主机（一个客户端，一个服务器）通过TCP协议通信
 * @author  zyh <2972140442@qq.com>
 * @date    2025-06-26
 * @license GPL-2.0
 * @note    客户端将终端输入的字符串发送给主机，本文件为客户端程序
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>

// 调试用错误输出宏
#define LOG_ERROR(fmt, ...) \
    fprintf(stderr, "[ERROR] %s:%d (%s): " fmt "\n", \
            __FILE__, __LINE__, __func__, ##__VA_ARGS__)

int main()
{
    // 创建套接字(socket)
    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if ( -1 == client_fd )
    {
        LOG_ERROR("semget failed,error: %d, %s\n", errno, strerror(errno));
        exit(errno);
    }

    // 连接服务器(connect)
    // TCP协议使用下面的数据类型来存储 目标IP 和 目标端口
    struct sockaddr_in server_addr;
    memset( &server_addr, 0, sizeof(server_addr) );
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8081);
    server_addr.sin_addr.s_addr = inet_addr("47.98.42.126");
    if ( -1 == connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) )
    {
        LOG_ERROR("semget failed,error: %d, %s\n", errno, strerror(errno));
        exit(errno);
    }
    // 收发数据(read/write或send/recv)
    char buf[1024];
    while(1)
    {
        memset(buf, 0, sizeof(buf));
        printf("请输入：");
        scanf("%s",buf);
        write(client_fd, buf, sizeof(buf)); 
    }
    

    // 关闭连接(close)
    close(client_fd);

    return 0;
}